package com.sth.shishan;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

import java.util.List;

/**
 * @Author: sitianhong
 * @Description: redis 的基本操作
 * @Since: create in 2021/6/13 0013 15:19
 */
public class RedisDemo {

    @Test//最简单的缓存示例
    public void demo1() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        jedis.set("sth", "大帅哥");
        System.out.println(jedis.get("sth"));
        jedis.close();
    }

    @Test //最简单基于nx的分布式锁
    public void demo2() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        String result = jedis.set("sth3", "大帅哥", SetParams.setParams().nx());
        System.out.println("第一次加锁" + result);
        String result2 = jedis.set("sth3", "大帅哥", SetParams.setParams().nx());
        System.out.println("第二次加锁" + result2);
        jedis.close();
    }

    @Test //博客网址的文章与查看
    public void demo3() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        Long publicResult = jedis.msetnx("article1:title", "学习redis,我要学号",
                "article1:content", "如何学好redis",
                "article2:auth", "司天宏");
        System.out.println("发布博客的结果 : " + publicResult);

        List<String> blog = jedis.mget("article1:title", "article1:content", "article2:auth");
        System.out.println("查看博客 " + blog);

        String updateResult = jedis.mset("article1:title", "修改后的学习redis",
                "article1:content", "修改后的如何学好redis",
                "article2:auth", "修改后的大帅哥司天宏");
        System.out.println("修改的博客的结果 " + updateResult);

        List<String> blog2 = jedis.mget("article1:title", "article1:content", "article2:auth");
        System.out.println("再次查看博客 " + blog2);

        Long strlen = jedis.strlen("article1:title");
        System.out.println("博客长度的统计 " + strlen);

        String getrange = jedis.getrange("article1:title", 0, 5);
        System.out.println("博客的预览 " + getrange);
        jedis.close();
    }

    @Test //用户操作的审计功能
    /**
     * 系统上一些用户的核心操作,比如更新一些数据的操作,都会有一个审计日志的功能,其实就是把用户的系统里面的一些操作记录下来,每次
     * 操作形成一条日志,设计日志
     * reids来存储这种操作审计日志,如何做?
     * 搞一个key,每天都有一个key,每天的这个key就把当天的所有操作日志都串联在一起,查询的时候,都是按每天的来查询你的
     * 操作日志审计日志就可以了,
     *
     * redis中的append Api
     */
    public void demo4() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        jedis.del("operation_log_2020_06_13");
        jedis.setnx("operation_log_2020_06_13", "");
        for (int i = 0; i < 10; i++) {
            jedis.append("operation_log_2020_06_13", "今天的第" + (i + 1) + "操作日志\n");
        }
        String operation_log_2020_06_13 = jedis.get("operation_log_2020_06_13");
        System.out.println("今天所有的操作日志: \n" + operation_log_2020_06_13);
        jedis.close();
    }

    @Test // 实现一个简单的唯一ID生成器
    public void demo5() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        for (int i = 0; i < 10; i++) {
            Long order_id_counter = jedis.incr("order_id_counter");
            System.out.println("生成的第 " + (i + 1) + " 个唯一ID" + order_id_counter);
        }
        jedis.close();
    }

    @Test // 实现博客点赞技术器
    public void demo6() {
        Jedis jedis = new Jedis("127.0.0.1", 6378);
        Long incr = jedis.incr("artcle:1:dianzan");
        System.out.println("点赞的次数 " + incr);
        // 取消点赞
        jedis.decr("artcle:1:dianzan");
        System.out.println("再次查看博客的点赞次数 " + jedis.get("artcle:1:dianzan"));
        jedis.close();
    }
}
